【k8s】2、二进制安装k8s |
您所在的位置:网站首页 › kubeadmin安装k8s 硬件要求 › 【k8s】2、二进制安装k8s |
文章目录
一、环境准备
二、操作系统的初始化
三、部署Etcd集群
1、 准备cfssl证书生成工具
2、生成etcd证书
3、部署Etcd集群
四、安装docker(所有node节点)
五、部署master组件
1、 准备证书
2、 准备二进制文件、token
3、 启动kube-apiserver服务
4、启动scheduler服务
5、启动controller-manager 服务
6、生成kubectl连接集群的kubeconfig文件
7、通过kubectl工具查看当前集群组件状态
六、部署worker node组件
理论部分描述
1、在所有 node 节点上操作
2、在master01上生成文件scp到node01
3、node01安装kubelet服务
4、master01验证CSR请求
5、node01安装proxy服务
七、部署CNI网络组建
1、部署flannel
2、部署calico
3、node02节点部署
八、部署core DNS
九、master02 节点部署
十、负载均衡部署(lb01、lb02)
1、部署nginx服务、配置四层负载均衡
2、部署keepalived服务
十一、部署Dashboard(master01)
前期概要
常见的K8S按照部署方式 minikube 是一个工具,可以在本地快速运行一个单节点微型K8S,仅用于学习,预习K8S的一些特性使用。Kubeadmin kubeadmin也是一个工具,特工kubeadm init 和kubedm join,用于快速部署k8s。相对简单。二进制安装部署 生产首选,从官方下载发行版的二进制包,手动部署每个组件的和自签TLS证书,组成K8S集群。 一、环境准备端口介绍 链接:https://pan.baidu.com/s/10gREJwP4JIN_tTxNv6YU-Q 提取码:yudq 主机名 ip地址 所需组件 master01 20.0.0.55 kube-apiserver、kubu-controller-manager、kube-scheduler、etcd master02 20.0.0.58 kube-apiserver、kubu-controller-manager、kube-scheduler node01 20.0.0.56 kubelet、kube-proxy、docker、flannel、etcd node02 20.0.0.57 kubelet、kube-proxy、docker、flannel、etcd lb01 20.0.0.59 nginx+keepalive lb02 20.0.0.60 nginx+keepaliveVIP:20.0.0.100 二、操作系统的初始化一键部署环境脚本。 #!/bin/bash # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X # 关闭selinux # 永久关闭 sed -i 's/enforcing/disabled/' /etc/selinux/config # 临时关闭 setenforce 0 # 关闭swap # 临时 swapoff -a # 永久关闭 sed -ri 's/.*swap.*/#&/' /etc/fstab # 在master添加hosts cat >> /etc/hosts "default": { "expiry": "87600h" }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF cat > ca-csr.json "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ] } EOF #######生成证书######################## cfssl gencert -initca ca-csr.json | cfssljson -bare ca - ##当前目录下会生成 ca.pem和ca-key.pem文件使用自签CA签发Etcd HTTPS证书 cat > server-csr.json "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF //上述文件hosts字段中ip为所有etcd节点的集群内部通信ip,一个都不能少,为了方便后期扩容,可以多些几个预留的IP。 ##############生成证书#################### cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server #当前目录下会生成server.pem 和 server-key.pem 3、部署Etcd集群因为咱们证书是在master01节点上操作的证书,先以master为例演示,然后将所有文件拷贝到node01和node02节点上操作。 创建工作目录并下载二进制包 wget https://github.com/etcd-io/etcd/releases/download/v3.4.9/etcd-v3.4.9-linux-amd64.tar.gz mkdir -p /opt/etcd/{ bin,cfg,ssl} #创建etcd集群的工作目录,【bin里面存放的是可执行文件,cfg配置文件,ssl证书】 tar -zxvf etcd-v3.4.9-linux-amd64.tar.gz #将下载的包解压 mv etcd-v3.4.9-linux-amd64/{ etcd,etcdctl} /opt/etcd/bin/ #将解压后的文件中,两个执行文件剪切到,前面创建集群目录中的bin目录下创建etcd配置文件 cat > /opt/etcd/cfg/etcd.conf "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF #生成CA证书和私钥(根证书和私钥) cat > ca-csr.json "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- #生成 apiserver 的证书和私钥(apiserver和其它k8s组件通信使用) #hosts中将所有可能作为 apiserver 的 ip 添加进去,后面 keepalived 使用的 VIP 也要加入 cat > apiserver-csr.json "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF // cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes apiserver-csr.json | cfssljson -bare apiserver #----------------------- #生成 kubectl 连接集群的证书和私钥,具有admin权限 cat > admin-csr.json "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "system:masters", "OU": "System" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin #----------------------- #生成 kube-proxy 的证书和私钥 cat > kube-proxy-csr.json "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "k8s", "OU": "System" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy此处一定要检查生成的证书配置文件是否到位 2、 准备二进制文件、token准备二进制文件 cd /opt/k8s/k8s-cert cp ca*pem apiserver*pem /opt/kubernetes/ssl/ ##复制CA证书、apiserver相关证书和私钥到 kubernetes工作目录的 ssl 子目录中 #然后再上传kubernetes-server-linux-amd64.tar.gz压缩包 tar zxvf kubernetes-server-linux-amd64.tar.gz #将上传的压缩包解压 cd kubernetes/server/bin #进入到压缩后的目录中 cp kube-apiserver kubectl kube-controller-manager kube-scheduler /opt/kubernetes/bin/ #将三个master的组件和一个kubectl命令拷贝到k8s的工作目录中的bin目录下 ln -s /opt/kubernetes/bin/* /usr/local/bin/ #创建master组件的关键命令文件到 kubernetes工作目录的 bin 子目录中(此处需要使用绝对路径创建软连接,不然软连接找不到源文件)准备token令牌 #创建 bootstrap token 认证文件,apiserver 启动时会调用,然后就相当于在集群内创建了一个这个用户,接下来就可以用 RBAC 给他授权 cd /opt/k8s/ vim token.sh #!/bin/bash #获取随机数前16个字节内容,以十六进制格式输出,并删除其中空格 BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ') #生成 token.csv 文件,按照 Token序列号,用户名,UID,用户组 的格式生成 cat > /opt/kubernetes/cfg/token.csv ETCD_SERVERS} \\ --bind-address=${ MASTER_ADDRESS} \\ --secure-port=6443 \\ --advertise-address=${ MASTER_ADDRESS} \\ --allow-privileged=true \\ --service-cluster-ip-range=10.0.0.0/24 \\ --enable-admission-plugins=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,NodeRestriction \\ --authorization-mode=RBAC,Node \\ --enable-bootstrap-token-auth=true \\ --token-auth-file=/opt/kubernetes/cfg/token.csv \\ --service-node-port-range=30000-50000 \\ --kubelet-client-certificate=/opt/kubernetes/ssl/apiserver.pem \\ --kubelet-client-key=/opt/kubernetes/ssl/apiserver-key.pem \\ --tls-cert-file=/opt/kubernetes/ssl/apiserver.pem \\ --tls-private-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\ --client-ca-file=/opt/kubernetes/ssl/ca.pem \\ --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \\ --service-account-issuer=api \\ --service-account-signing-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\ --etcd-cafile=/opt/etcd/ssl/ca.pem \\ --etcd-certfile=/opt/etcd/ssl/server.pem \\ --etcd-keyfile=/opt/etcd/ssl/server-key.pem \\ --requestheader-client-ca-file=/opt/kubernetes/ssl/ca.pem \\ --proxy-client-cert-file=/opt/kubernetes/ssl/apiserver.pem \\ --proxy-client-key-file=/opt/kubernetes/ssl/apiserver-key.pem \\ --requestheader-allowed-names=kubernetes \\ --requestheader-extra-headers-prefix=X-Remote-Extra- \\ --requestheader-group-headers=X-Remote-Group \\ --requestheader-username-headers=X-Remote-User \\ --enable-aggregator-routing=true \\ --audit-log-maxage=30 \\ --audit-log-maxbackup=3 \\ --audit-log-maxsize=100 \\ --audit-log-path=/opt/kubernetes/logs/k8s-audit.log" EOF #--logtostderr=true:启用日志。输出日志到标准错误控制台,不输出到文件 #--v=4:日志等级。指定输出日志的级别,v=4为调试级别详细输出 #--etcd-servers:etcd集群地址。指定etcd服务器列表(格式://ip:port),逗号分隔 #--bind-address:监听地址。指定 HTTPS 安全接口的监听地址,默认值0.0.0.0 #--secure-port:https安全端口。指定 HTTPS 安全接口的监听端口,默认值6443 #--advertise-address:集群通告地址。通过该 ip 地址向集群其他节点公布 api server 的信息,必须能够被其他节点访问 #--allow-privileged=true:启用授权。允许拥有系统特权的容器运行,默认值false #--service-cluster-ip-range:Service虚拟IP地址段。指定 Service Cluster IP 地址段 #--enable-admission-plugins:准入控制模块。kuberneres集群的准入控制机制,各控制模块以插件的形式依次生效,集群时必须包含ServiceAccount,运行在认证(Authentication)、授权(Authorization)之后,Admission Control是权限认证链上的最后一环, 对请求API资源对象进行修改和校验 #--authorization-mode:认证授权,启用RBAC授权和节点自管理。在安全端口使用RBAC,Node授权模式,未通过授权的请求拒绝,默认值AlwaysAllow。RBAC是用户通过角色与权限进行关联的模式;Node模式(节点授权)是一种特殊用途的授权模式,专门授权由kubelet发出的API请求,在进行认证时,先通过用户名、用户分组验证是否是集群中的Node节点,只有是Node节点的请求才能使用Node模式授权 #--enable-bootstrap-token-auth:启用TLS bootstrap机制。在apiserver上启用Bootstrap Token 认证 #--token-auth-file=/opt/kubernetes/cfg/token.csv:指定bootstrap token认证文件路径 #--service-node-port-range:指定 Service NodePort 的端口范围,默认值30000-32767 #–-kubelet-client-xxx:apiserver访问kubelet客户端证书 #--tls-xxx-file:apiserver https证书 #1.20版本必须加的参数:–-service-account-issuer,–-service-account-signing-key-file #--etcd-xxxfile:连接Etcd集群证书 #–-audit-log-xxx:审计日志 #启动聚合层相关配置:–requestheader-client-ca-file,–proxy-client-cert-file,–proxy-client-key-file,–requestheader-allowed-names,–requestheader-extra-headers-prefix,–requestheader-group-headers,–requestheader-username-headers,–enable-aggregator-routing #创建 kube-apiserver.service 服务管理文件 cat >/usr/lib/systemd/system/kube-apiserver.service kube-scheduler-csr.json "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "system:masters", "OU": "System" } ] } EOF #生成证书 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-scheduler-csr.json | cfssljson -bare kube-scheduler #生成kubeconfig文件 KUBE_CONFIG="/opt/kubernetes/cfg/kube-scheduler.kubeconfig" KUBE_APISERVER="https://$MASTER_ADDRESS:6443" kubectl config set-cluster kubernetes \ --certificate-authority=/opt/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${ KUBE_APISERVER} \ --kubeconfig=${ KUBE_CONFIG} kubectl config set-credentials kube-scheduler \ --client-certificate=./kube-scheduler.pem \ --client-key=./kube-scheduler-key.pem \ --embed-certs=true \ --kubeconfig=${ KUBE_CONFIG} kubectl config set-context default \ --cluster=kubernetes \ --user=kube-scheduler \ --kubeconfig=${ KUBE_CONFIG} kubectl config use-context default --kubeconfig=${ KUBE_CONFIG} ##创建 kube-scheduler.service 服务管理文件 cat >/usr/lib/systemd/system/kube-scheduler.service kube-controller-manager-csr.json "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing", "O": "system:masters", "OU": "System" } ] } EOF #生成证书 cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager #生成kubeconfig文件 KUBE_CONFIG="/opt/kubernetes/cfg/kube-controller-manager.kubeconfig" KUBE_APISERVER="https://$1:6443" kubectl config set-cluster kubernetes \ --certificate-authority=/opt/kubernetes/ssl/ca.pem \ --embed-certs=true \ --server=${ KUBE_APISERVER} \ --kubeconfig=${ KUBE_CONFIG} kubectl config set-credentials kube-controller-manager \ --client-certificate=./kube-controller-manager.pem \ --client-key=./kube-controller-manager-key.pem \ --embed-certs=true \ --kubeconfig=${ KUBE_CONFIG} kubectl config set-context default \ --cluster=kubernetes \ --user=kube-controller-manager \ --kubeconfig=${ KUBE_CONFIG} kubectl config use-context default --kubeconfig=${ KUBE_CONFIG} ##创建 kube-controller-manager.service 服务管理文件 cat >/usr/lib/systemd/system/kube-controller-manager.service KUBE_CONFIG} kubectl config set-credentials cluster-admin \ --client-certificate=./admin.pem \ --client-key=./admin-key.pem \ --embed-certs=true \ --kubeconfig=${ KUBE_CONFIG} kubectl config set-context default \ --cluster=kubernetes \ --user=cluster-admin \ --kubeconfig=${ KUBE_CONFIG} kubectl config use-context default --kubeconfig=${ KUBE_CONFIG}执行脚本 7、通过kubectl工具查看当前集群组件状态 kubectl get cs #查看当前集群组件状态(都为健康状态即可,如果不健康,需要排错) kubectl version #查看版本信息(显示客户端和服务端的版本信息) 六、部署worker node组件 理论部分描述kubelet 采用TLS Bootstapping 机制,自动完成到kube-apiserver的注册,在node节点量较大或后期自动扩容时非常有用。 master apiserver 启用TLS认证后,node节点kubelet组件想要加入集群,必须使用CA签发的有效证书才能于apiserver通信,当node节点很多时,**签署证书是一件很繁琐的事情,因此kubernetes引入了 TLS bootstraping 机制来自动颁发客户端证书,**kubelet会以一个低权限的用户自动向api server申请证书,kuubelet的证书由apiserver动态签署。 kuubelet首次启动通过加载bootstrap.kubeconfig 中的用户 Token 和 apiserver CA 证书发起首次CSR 请求, 这个Token被预先内置在apiserver节点的token.csv中,其身份为 kubelet-bootstrap 用户和system:kubelet-bootstrap 用户组,想要首次CSR请求成功(就是不会被apiserver 401拒绝),则需要先创建一个 ClusterRoleBinding,将kubelet-bootstrap用户和system:node-bootstrapper内置 ClusterRole绑定(通过kubelet get clustterroles 可查询),使其能够发起CSR认证请求。 TLS bootstrapping 时的证书实际是由 kube-controller-manager 组件来签署的,也就是说证书有效期是 kube-controller-manager 组件控制的; kube-controller-manager 组件提供了一个 --experimental-cluster-signing-duration 参数来设置签署的证书有效时间;默认为 8760h0m0s,将其改为 87600h0m0s,即 10 年后再进行 TLS bootstrapping 签署证书即可。 也就是说 kubelet 首次访问 API Server 时,是使用 token 做认证,通过后,Controller Manager 会为 kubelet 生成一个证书,以后的访问都是用证书做认证了。 1、在所有 node 节点上操作 mkdir -p /opt/kubernetes/{ bin,cfg,ssl,logs} #创建kubernetes的工作目录(提前创建号两个node的k8s的工作目录) 2、在master01上生成文件scp到node01 cd /opt/k8s/k8s-cert/kubernetes/server/bin #在master01中进入到前面解压的用压缩文件,里面有node节点需要用到的两个组件,一个kubelet、一个lube-proxy组件 scp kubelet kube-proxy [email protected]20.0.0.56:/opt/kubernetes/bin/ scp kubelet kube-proxy [email protected]20.0.0.57:/opt/kubernetes/bin/ #把kubelet、kube-proxy 拷贝到 node 节点的工作目录中(因为是执行文件所以拷贝到bin目录下)准备kubeconfig脚本文件 vim /opt/k8s/k8s-cert/kubeconfig.sh #!/bin/bash #example: kubeconfig 20.0.0.55 /opt/k8s/k8s-cert/ #创建bootstrap.kubeconfig文件 #该文件中内置了 token.csv 中用户的 Token,以及 apiserver CA 证书;kubelet 首次启动会加载此文件,使用 apiserver CA 证书建立与 apiserver 的 TLS 通讯,使用其中的用户 Token 作为身份标识向 apiserver 发起 CSR 请求 BOOTSTRAP_TOKEN=$(awk -F ',' '{print $1}' /opt/kubernetes/cfg/token.csv) #获取token令牌 APISERVER=$1 #位置变量,获取本机ip SSL_DIR=$2 #获取存放路径。 export KUBE_APISERVER="https://$APISERVER:6443" # 设置集群参数 kubectl config set-cluster kubernetes \ --certificate-authority=$SSL_DIR/ca.pem \ --embed-certs=true \ --server=${ KUBE_APISERVER} \ --kubeconfig=bootstrap.kubeconfig #--embed-certs=true:表示将ca.pem证书写入到生成的bootstrap.kubeconfig文件中 # 设置客户端认证参数,kubelet 使用 bootstrap token 认证 kubectl config set-credentials kubelet-bootstrap \ --token=${ BOOTSTRAP_TOKEN} \ --kubeconfig=bootstrap.kubeconfig # 设置上下文参数 kubectl config set-context default \ --cluster=kubernetes \ --user=kubelet-bootstrap \ --kubeconfig=bootstrap.kubeconfig # 使用上下文参数生成 bootstrap.kubeconfig 文件 kubectl config use-context default --kubeconfig=bootstrap.kubeconfig #---------------------- #创建kube-proxy.kubeconfig文件 # 设置集群参数 kubectl config set-cluster kubernetes \ --certificate-authority=$SSL_DIR/ca.pem \ --embed-certs=true \ --server=${ KUBE_APISERVER} \ --kubeconfig=kube-proxy.kubeconfig # 设置客户端认证参数,kube-proxy 使用 TLS 证书认证 kubectl config set-credentials kube-proxy \ --client-certificate=$SSL_DIR/kube-proxy.pem \ --client-key=$SSL_DIR/kube-proxy-key.pem \ --embed-certs=true \ --kubeconfig=kube-proxy.kubeconfig # 设置上下文参数 kubectl config set-context default \ --cluster=kubernetes \ --user=kube-proxy \ --kubeconfig=kube-proxy.kubeconfig # 使用上下文参数生成 kube-proxy.kubeconfig 文件 kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig执行脚本文件 cd /opt/k8s/k8s-cert/ chmod +x kubeconfig.sh ./kubeconfig.sh 20.0.0.55 /opt/k8s/k8s-cert/ #执行脚本,需要添加两个位置变量,一个本机IP,一个生成的文件所在的目录 cd /opt/k8s/k8s-cert/ scp bootstrap.kubeconfig kube-proxy.kubeconfig [email protected]20.0.0.56:/opt/kubernetes/cfg/ scp bootstrap.kubeconfig kube-proxy.kubeconfig [email protected]20.0.0.57:/opt/kubernetes/cfg/ #把配置文件 bootstrap.kubeconfig、kube-proxy.kubeconfig 拷贝到 node 节点 kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap #RBAC授权,使用户 kubelet-bootstrap 能够有权限发起 CSR 请求证书 kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous #给kubectl绑定默认cluster-admin管理员集群角色,授权集群操作权限 3、node01安装kubelet服务准备kubelet服务的执行脚本文件 mkdir /opt/k8s-cert/ #创建一个目录用来存储脚本文件 vim /opt/k8s-cert/kubelet.sh #!/bin/bash #例子:./kubelet.sh 20.0.0.56 NODE_ADDRESS=$1 DNS_SERVER_IP=${ 2:-"10.0.0.2"} #创建 kubelet 启动参数配置文件 cat >/opt/kubernetes/cfg/kubelet |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |